package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.MunicipioDAO;
import mx.ipn.persistencia.dao.EstadoDAO;
import mx.ipn.to.MunicipioTO;
import mx.ipn.to.EstadoTO;

public class MunicipioDAOMySQL implements MunicipioDAO {
    static{FabricaDeDAOsMySQL.iniciaLog(MunicipioDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO municipio (id_estado,nombre) VALUES(?,?)";
	private static final String DELETE = "DELETE FROM municipio WHERE id_municipio=?";
	private static final String UPDATE = "UPDATE municipio SET id_estado=?, nombre=? WHERE id_municipio=?";
	private static final String FINDBYID = "SELECT * FROM municipio WHERE id_municipio=?";
	private static final String FINDBYNOMBREESTADO = "SELECT * FROM municipio WHERE nombre=? and id_estado=?";
	private static final String SELECT = "SELECT * FROM municipio";
	private static final String SELECTBYESTADO = "SELECT * FROM municipio WHERE id_estado=?";

	FabricaDeDAOs fabricaMySQL;

	public boolean insertMunicipio(MunicipioTO municipioTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setShort(1, municipioTO.getEstadoTO().getIdEstado());
			ps.setString(2, municipioTO.getNombre());
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	public short deleteMunicipio(int idMunicipio) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DELETE);

			ps.setInt(1, idMunicipio);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	public short updateMunicipio(MunicipioTO municipioTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setShort(1, municipioTO.getEstadoTO().getIdEstado());
			ps.setString(2, municipioTO.getNombre());
			ps.setInt(3, municipioTO.getIdMunicipio());
			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	public MunicipioTO findMunicipioById(int idMunicipio) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idMunicipio);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			EstadoDAO edoDAO = fabricaMySQL.getEstadoDAO();
			if (rs.next()) {
				idMunicipio = rs.getInt("id_municipio");
				EstadoTO edTO = edoDAO.findEstadoById(rs.getShort("id_estado"));
				String nombre = rs.getString("nombre");
				MunicipioTO municipioTO = new MunicipioTO(idMunicipio, nombre,
						edTO);

				ps.close();
				conexion.close();
				return municipioTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public MunicipioTO findMunicipioByNombreEstado(String nombre, short idEstado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(FINDBYNOMBREESTADO);

			ps.setString(1, nombre);
			ps.setShort(2, idEstado);

			ResultSet rs = ps.executeQuery();

			fabricaMySQL = FabricaDeDAOs.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			EstadoDAO edoDAO = fabricaMySQL.getEstadoDAO();

			if (rs.next()) {
				int idMunicipio = rs.getShort("id_municipio");
				EstadoTO edTO = edoDAO.findEstadoById(rs.getShort("id_estado"));
				nombre = rs.getString("nombre");
				MunicipioTO municipioTO = new MunicipioTO(idMunicipio, nombre,
						edTO);

				ps.close();
				conexion.close();
				return municipioTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public ArrayList<MunicipioTO> selectMunicipio() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			EstadoDAO estadoDAO = null;

			ArrayList<MunicipioTO> municipioTO = null;
			MunicipioTO municipioTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (municipioTO == null) {
					municipioTO = new ArrayList<MunicipioTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					estadoDAO = fabricaMySQL.getEstadoDAO();
				}

				municipioTO2 = new MunicipioTO(rs.getInt("id_municipio"), rs
						.getString("nombre"), estadoDAO.findEstadoById(rs
						.getShort("id_estado")));

				municipioTO.add(municipioTO2);
			}
			ps.close();
			conexion.close();
			return municipioTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public MunicipioTO selectMunicipioByEstado(short idEstado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			EstadoDAO estadoDAO = null;

			ArrayList<Integer> listIdMunicipio = null;
			ArrayList<String> listNombre = null;

			MunicipioTO municipioTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYESTADO);
			ps.setShort(1, idEstado);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdMunicipio == null) {

					listIdMunicipio = new ArrayList<Integer>();
					listNombre = new ArrayList<String>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					estadoDAO = fabricaMySQL.getEstadoDAO();
				}

				listIdMunicipio.add(rs.getInt("id_municipio"));
				listNombre.add(rs.getString("nombre"));
			}
			if (listIdMunicipio != null) {
				
				String[] arrNombre = (String[])listNombre.toArray(new String[listNombre.size()]);
				Integer[] arrIdMunicipio = (Integer[])listIdMunicipio.toArray(new Integer[listIdMunicipio.size()]);
				
				municipioTO = new MunicipioTO(arrIdMunicipio, arrNombre,
						estadoDAO.findEstadoById(idEstado));
			}
			ps.close();
			conexion.close();
			
			return municipioTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

}
